home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Graphics Programming (2nd Edition) / Visual Basic Graphics Programming 2nd Edition.iso / OldSrc / CH10 / SRC / EXTRUDE.FRM < prev    next >
Text File  |  1996-05-02  |  20KB  |  716 lines

  1. VERSION 4.00
  2. Begin VB.Form ExtrudeForm 
  3.    Appearance      =   0  'Flat
  4.    BackColor       =   &H00C0C0C0&
  5.    Caption         =   "Extrude"
  6.    ClientHeight    =   5700
  7.    ClientLeft      =   690
  8.    ClientTop       =   900
  9.    ClientWidth     =   7830
  10.    BeginProperty Font 
  11.       name            =   "MS Sans Serif"
  12.       charset         =   1
  13.       weight          =   700
  14.       size            =   8.25
  15.       underline       =   0   'False
  16.       italic          =   0   'False
  17.       strikethrough   =   0   'False
  18.    EndProperty
  19.    ForeColor       =   &H80000008&
  20.    Height          =   6390
  21.    KeyPreview      =   -1  'True
  22.    Left            =   630
  23.    LinkTopic       =   "Form1"
  24.    ScaleHeight     =   380
  25.    ScaleMode       =   3  'Pixel
  26.    ScaleWidth      =   522
  27.    Top             =   270
  28.    Width           =   7950
  29.    Begin VB.CommandButton CmdExtrude 
  30.       Caption         =   "Extrude"
  31.       Height          =   495
  32.       Left            =   720
  33.       TabIndex        =   11
  34.       Top             =   5040
  35.       Width           =   855
  36.    End
  37.    Begin VB.Frame Frame2 
  38.       Caption         =   "Curve"
  39.       Height          =   2415
  40.       Left            =   0
  41.       TabIndex        =   10
  42.       Top             =   0
  43.       Width           =   2295
  44.       Begin VB.OptionButton CurveChoice 
  45.          Caption         =   "Sine Wave"
  46.          Height          =   255
  47.          Index           =   5
  48.          Left            =   120
  49.          TabIndex        =   22
  50.          Top             =   2040
  51.          Width           =   2055
  52.       End
  53.       Begin VB.OptionButton CurveChoice 
  54.          Caption         =   "Small Circle"
  55.          Height          =   255
  56.          Index           =   4
  57.          Left            =   120
  58.          TabIndex        =   21
  59.          Top             =   1680
  60.          Width           =   2055
  61.       End
  62.       Begin VB.OptionButton CurveChoice 
  63.          Caption         =   "Circle"
  64.          Height          =   255
  65.          Index           =   3
  66.          Left            =   120
  67.          TabIndex        =   20
  68.          Top             =   1320
  69.          Width           =   2055
  70.       End
  71.       Begin VB.OptionButton CurveChoice 
  72.          Caption         =   "Semicircle"
  73.          Height          =   255
  74.          Index           =   2
  75.          Left            =   120
  76.          TabIndex        =   19
  77.          Top             =   960
  78.          Width           =   2055
  79.       End
  80.       Begin VB.OptionButton CurveChoice 
  81.          Caption         =   "Rectangle"
  82.          Height          =   255
  83.          Index           =   1
  84.          Left            =   120
  85.          TabIndex        =   18
  86.          Top             =   600
  87.          Width           =   2055
  88.       End
  89.       Begin VB.OptionButton CurveChoice 
  90.          Caption         =   "Square"
  91.          Height          =   255
  92.          Index           =   0
  93.          Left            =   120
  94.          TabIndex        =   12
  95.          Top             =   240
  96.          Value           =   -1  'True
  97.          Width           =   2055
  98.       End
  99.    End
  100.    Begin VB.Frame Frame1 
  101.       Caption         =   "Path"
  102.       Height          =   2415
  103.       Left            =   0
  104.       TabIndex        =   8
  105.       Top             =   2520
  106.       Width           =   2295
  107.       Begin VB.OptionButton PathChoice 
  108.          Caption         =   "Circle"
  109.          Height          =   255
  110.          Index           =   5
  111.          Left            =   120
  112.          TabIndex        =   17
  113.          Top             =   2040
  114.          Width           =   2055
  115.       End
  116.       Begin VB.OptionButton PathChoice 
  117.          Caption         =   "Semicircle"
  118.          Height          =   255
  119.          Index           =   4
  120.          Left            =   120
  121.          TabIndex        =   16
  122.          Top             =   1680
  123.          Width           =   2055
  124.       End
  125.       Begin VB.OptionButton PathChoice 
  126.          Caption         =   "Helix"
  127.          Height          =   255
  128.          Index           =   3
  129.          Left            =   120
  130.          TabIndex        =   15
  131.          Top             =   1320
  132.          Width           =   2055
  133.       End
  134.       Begin VB.OptionButton PathChoice 
  135.          Caption         =   "Wavy Line"
  136.          Height          =   255
  137.          Index           =   2
  138.          Left            =   120
  139.          TabIndex        =   14
  140.          Top             =   960
  141.          Width           =   2055
  142.       End
  143.       Begin VB.OptionButton PathChoice 
  144.          Caption         =   "Angled Line"
  145.          Height          =   255
  146.          Index           =   1
  147.          Left            =   120
  148.          TabIndex        =   13
  149.          Top             =   600
  150.          Width           =   2055
  151.       End
  152.       Begin VB.OptionButton PathChoice 
  153.          Caption         =   "Vertical Line"
  154.          Height          =   255
  155.          Index           =   0
  156.          Left            =   120
  157.          TabIndex        =   9
  158.          Top             =   240
  159.          Value           =   -1  'True
  160.          Width           =   2055
  161.       End
  162.    End
  163.    Begin VB.CheckBox ShowAxesCheck 
  164.       Caption         =   "Show Axes"
  165.       Height          =   255
  166.       Left            =   2400
  167.       TabIndex        =   7
  168.       Top             =   5400
  169.       Width           =   1335
  170.    End
  171.    Begin VB.TextBox PhiText 
  172.       Height          =   285
  173.       Left            =   6960
  174.       TabIndex        =   6
  175.       Text            =   "0.1570"
  176.       Top             =   5400
  177.       Width           =   855
  178.    End
  179.    Begin VB.TextBox ThetaText 
  180.       Height          =   285
  181.       Left            =   5640
  182.       TabIndex        =   4
  183.       Text            =   "0.6283"
  184.       Top             =   5400
  185.       Width           =   855
  186.    End
  187.    Begin VB.TextBox RText 
  188.       Height          =   285
  189.       Left            =   4080
  190.       TabIndex        =   2
  191.       Text            =   "10"
  192.       Top             =   5400
  193.       Width           =   855
  194.    End
  195.    Begin VB.PictureBox Pict 
  196.       AutoRedraw      =   -1  'True
  197.       Height          =   5295
  198.       Left            =   2400
  199.       ScaleHeight     =   349
  200.       ScaleMode       =   3  'Pixel
  201.       ScaleWidth      =   357
  202.       TabIndex        =   0
  203.       Top             =   0
  204.       Width           =   5415
  205.    End
  206.    Begin MSComDlg.CommonDialog LoadDialog 
  207.       Left            =   1680
  208.       Top             =   5040
  209.       _version        =   65536
  210.       _extentx        =   847
  211.       _extenty        =   847
  212.       _stockprops     =   0
  213.       cancelerror     =   -1  'True
  214.    End
  215.    Begin VB.Label Label1 
  216.       Caption         =   "Phi"
  217.       Height          =   255
  218.       Index           =   2
  219.       Left            =   6600
  220.       TabIndex        =   5
  221.       Top             =   5415
  222.       Width           =   375
  223.    End
  224.    Begin VB.Label Label1 
  225.       Caption         =   "Theta"
  226.       Height          =   255
  227.       Index           =   1
  228.       Left            =   5040
  229.       TabIndex        =   3
  230.       Top             =   5415
  231.       Width           =   495
  232.    End
  233.    Begin VB.Label Label1 
  234.       Caption         =   "R"
  235.       Height          =   255
  236.       Index           =   0
  237.       Left            =   3840
  238.       TabIndex        =   1
  239.       Top             =   5415
  240.       Width           =   255
  241.    End
  242.    Begin VB.Menu mnuFile 
  243.       Caption         =   "&File"
  244.       Begin VB.Menu mnuFileLoad 
  245.          Caption         =   "&Load..."
  246.          Shortcut        =   ^L
  247.       End
  248.       Begin VB.Menu mnuFileSaveAs 
  249.          Caption         =   "&Save As..."
  250.          Shortcut        =   ^A
  251.       End
  252.       Begin VB.Menu mnuFileSep 
  253.          Caption         =   "-"
  254.       End
  255.       Begin VB.Menu mnuFileExit 
  256.          Caption         =   "E&xit"
  257.       End
  258.    End
  259. End
  260. Attribute VB_Name = "ExtrudeForm"
  261. Attribute VB_Creatable = False
  262. Attribute VB_Exposed = False
  263. Option Explicit
  264.  
  265. ' Location of viewing eye.
  266. Dim EyeR As Single
  267. Dim EyeTheta As Single
  268. Dim EyePhi As Single
  269.  
  270. Const dtheta = PI / 20
  271. Const Dphi = PI / 20
  272. Const Dr = 1
  273.  
  274. ' Location of focus point.
  275. Const FocusX = 0#
  276. Const FocusY = 0#
  277. Const FocusZ = 0#
  278.  
  279. Dim Projector(1 To 4, 1 To 4) As Single
  280.  
  281. Dim CurveNum As Integer
  282. Dim PathNum As Integer
  283.  
  284. Dim ThePicture As ObjPicture
  285. Dim TheExtrusion As ObjExtrusion
  286.  
  287. Dim ShowingParameters As Boolean
  288. ' ************************************************
  289. ' Create the selected path.
  290. ' ************************************************
  291. Sub CreatePath()
  292. Dim y As Single
  293. Dim R As Single
  294. Dim dtheta As Single
  295. Dim theta As Single
  296.  
  297.     Select Case PathNum
  298.         Case 0  ' Vertical line.
  299.             For y = 0 To 4 Step 0.5
  300.                 TheExtrusion.AddPathPoint 0, y, 0
  301.             Next y
  302.  
  303.         Case 1  ' Angled line.
  304.             For y = 0 To 4 Step 0.5
  305.                 TheExtrusion.AddPathPoint y / 2, y, y / 2
  306.             Next y
  307.         
  308.         Case 2  ' Wavy line.
  309.             R = 2
  310.             dtheta = PI / 5
  311.             TheExtrusion.AddPathPoint 0, 0, 0
  312.             For theta = dtheta To 2 * PI Step dtheta
  313.                 TheExtrusion.AddPathPoint _
  314.                     R * Sin(theta), theta * 0.7, 0
  315.             Next theta
  316.         
  317.         Case 3  ' Helix.
  318.             R = 2
  319.             dtheta = PI / 10
  320.             TheExtrusion.AddPathPoint R, 0, 0
  321.             For theta = dtheta To 2 * PI Step dtheta
  322.                 TheExtrusion.AddPathPoint _
  323.                     R * Cos(theta), _
  324.                     theta * 0.8, _
  325.                     R * Sin(theta)
  326.             Next theta
  327.             
  328.         Case 4  ' Semicircle.
  329.             R = 2
  330.             dtheta = PI / 10
  331.             TheExtrusion.AddPathPoint 0, 0, 0
  332.             For theta = dtheta To PI Step dtheta
  333.                 TheExtrusion.AddPathPoint _
  334.                     R * Sin(theta), _
  335.                     R * (1 - Cos(theta)), _
  336.                     0
  337.             Next theta
  338.         
  339.         Case 5  ' Circle.
  340.             R = 2
  341.             dtheta = PI / 10
  342.             TheExtrusion.AddPathPoint 0, 0, 0
  343.             For theta = dtheta To 2 * PI - dtheta + 0.01 Step dtheta
  344.                 TheExtrusion.AddPathPoint _
  345.                     R * Sin(theta), _
  346.                     R * (1 - Cos(theta)), _
  347.                     0
  348.             Next theta
  349.             TheExtrusion.AddPathPoint 0, 0, 0
  350.     
  351.     End Select
  352. End Sub
  353.  
  354.  
  355. ' ************************************************
  356. ' Create the selected curve.
  357. ' ************************************************
  358. Sub CreateCurve()
  359. Dim R As Single
  360. Dim dtheta As Single
  361. Dim theta As Single
  362.  
  363.     Select Case CurveNum
  364.         Case 0  ' Square.
  365.             TheExtrusion.AddCurvePoint -2, 0, -2
  366.             TheExtrusion.AddCurvePoint -2, 0, 2
  367.             TheExtrusion.AddCurvePoint 2, 0, 2
  368.             TheExtrusion.AddCurvePoint 2, 0, -2
  369.             TheExtrusion.AddCurvePoint -2, 0, -2
  370.  
  371.         Case 1  ' Rectangle.
  372.             TheExtrusion.AddCurvePoint -0.5, 0, -2
  373.             TheExtrusion.AddCurvePoint -0.5, 0, 2
  374.             TheExtrusion.AddCurvePoint 0.5, 0, 2
  375.             TheExtrusion.AddCurvePoint 0.5, 0, -2
  376.             TheExtrusion.AddCurvePoint -0.5, 0, -2
  377.         
  378.         Case 2  ' Semicircle.
  379.             R = 2
  380.             dtheta = PI / 10
  381.             TheExtrusion.AddCurvePoint R, 0, 0
  382.             For theta = dtheta To PI Step dtheta
  383.                 TheExtrusion.AddCurvePoint _
  384.                     R * Cos(theta), 0, R * Sin(theta)
  385.             Next theta
  386.             
  387.         Case 3, 4   ' Circle, small circle.
  388.             If CurveNum = 3 Then
  389.                 R = 2
  390.                 dtheta = PI / 10
  391.             Else
  392.                 R = 0.5
  393.                 dtheta = PI / 4
  394.             End If
  395.             TheExtrusion.AddCurvePoint R, 0, 0
  396.             For theta = dtheta To 2 * PI - dtheta + 0.1 Step dtheta
  397.                 TheExtrusion.AddCurvePoint _
  398.                     R * Cos(theta), 0, R * Sin(theta)
  399.             Next theta
  400.             TheExtrusion.AddCurvePoint R, 0, 0
  401.             
  402.         Case 5  ' Sine wave.
  403.             R = 2
  404.             dtheta = PI / 10
  405.             theta = -PI / 2
  406.             TheExtrusion.AddCurvePoint _
  407.                 R * Sin(theta), 0, 2 * theta
  408.             For theta = -PI / 2 + dtheta To PI / 2 Step dtheta
  409.                 TheExtrusion.AddCurvePoint _
  410.                     R * Sin(theta), 0, 2 * theta
  411.             Next theta
  412.             
  413.     End Select
  414. End Sub
  415.  
  416.  
  417.  
  418.  
  419. Sub WaitEnd()
  420.     MousePointer = vbDefault
  421. End Sub
  422.  
  423. Sub WaitStart()
  424.     MousePointer = vbHourglass
  425.     DoEvents
  426. End Sub
  427.  
  428.  
  429. ' ************************************************
  430. ' Create the extruded data and display it.
  431. ' ************************************************
  432. Private Sub CmdExtrude_Click()
  433. Dim pline As ObjPolyline
  434.  
  435.     ' If we currently have an APF file loaded,
  436.     ' restore default settings.
  437.     If CurveNum > 5 Then
  438.         CurveChoice(0).value = True
  439.         PathChoice(0).value = True
  440.     End If
  441.     
  442.     WaitStart
  443.     Set ThePicture = New ObjPicture
  444.     Set TheExtrusion = New ObjExtrusion
  445.     ThePicture.objects.Add TheExtrusion
  446.     
  447.     CreateCurve
  448.     CreatePath
  449.     TheExtrusion.Extrude
  450.     
  451.     If ShowAxesCheck.value = vbChecked Then
  452.         Set pline = New ObjPolyline
  453.         ThePicture.objects.Add pline
  454.         pline.AddSegment 0, 0, 0, 5, 0, 0
  455.         pline.AddSegment 0, 0, 0, 0, 5, 0
  456.         pline.AddSegment 0, 0, 0, 0, 0, 5
  457.     End If
  458.     
  459.     DrawData Pict
  460.     Pict.SetFocus
  461. End Sub
  462. Private Sub CurveChoice_Click(Index As Integer)
  463.     CurveNum = Index
  464.     Pict.SetFocus
  465. End Sub
  466.  
  467. ' *******************************************************
  468. ' Rotate the points in the cube and draw the cube.
  469. ' *******************************************************
  470. Private Sub DrawData(pic As Object)
  471. Dim x As Single
  472. Dim y As Single
  473. Dim z As Single
  474. Dim S(1 To 4, 1 To 4) As Single
  475. Dim t(1 To 4, 1 To 4) As Single
  476. Dim ST(1 To 4, 1 To 4) As Single
  477. Dim PST(1 To 4, 1 To 4) As Single
  478.  
  479.     MousePointer = vbHourglass
  480.     Refresh
  481.     
  482.     ' Prevent overflow errors when drawing lines
  483.     ' too far out of bounds.
  484.     On Error Resume Next
  485.     
  486.     ' Scale and translate so it looks OK in pixels.
  487.     m3Scale S, 35, -35, 1
  488.     m3Translate t, 180, 250, 0
  489.     m3MatMultiplyFull ST, S, t
  490.     m3MatMultiplyFull PST, Projector, ST
  491.     
  492.     ' Transform the points.
  493.     ThePicture.ApplyFull PST
  494.  
  495.     ' Display the data.
  496.     pic.Cls
  497.     ThePicture.Draw pic, EyeR
  498.     pic.Refresh
  499.  
  500.     ' Display the viewnig parameters.
  501.     ShowViewingParameters
  502.  
  503.     MousePointer = vbDefault
  504. End Sub
  505.  
  506. Sub ShowViewingParameters()
  507.     ShowingParameters = True
  508.     
  509.     RText.Text = Format$(EyeR, "0.0000")
  510.     ThetaText.Text = Format$(EyeTheta, "0.0000")
  511.     PhiText.Text = Format$(EyePhi, "0.0000")
  512.     
  513.     RText.Refresh
  514.     ThetaText.Refresh
  515.     PhiText.Refresh
  516.  
  517.     ShowingParameters = False
  518. End Sub
  519.  
  520.  
  521. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  522.     Select Case KeyCode
  523.         Case vbKeyLeft
  524.             EyeTheta = EyeTheta - dtheta
  525.         
  526.         Case vbKeyRight
  527.             EyeTheta = EyeTheta + dtheta
  528.         
  529.         Case vbKeyUp
  530.             EyePhi = EyePhi - Dphi
  531.         
  532.         Case vbKeyDown
  533.             EyePhi = EyePhi + Dphi
  534.                 
  535.         Case Else
  536.             Exit Sub
  537.     End Select
  538.  
  539.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  540.     DrawData Pict
  541. End Sub
  542.  
  543.  
  544. Private Sub Form_KeyPress(KeyAscii As Integer)
  545.     Select Case KeyAscii
  546.         Case Asc("+")
  547.             EyeR = EyeR + Dr
  548.         
  549.         Case Asc("-")
  550.             EyeR = EyeR - Dr
  551.         
  552.         Case Else
  553.             Exit Sub
  554.     End Select
  555.  
  556.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  557.     DrawData Pict
  558. End Sub
  559.  
  560. Private Sub Form_Load()
  561.     ' Initialize the eye position.
  562.     EyeR = 10
  563.     EyeTheta = PI * 0.2
  564.     EyePhi = PI * 0.1
  565.     
  566.     ' Initialize the projection transformation.
  567.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  568. End Sub
  569.  
  570.  
  571. Private Sub mnuFileExit_Click()
  572.     Unload Me
  573. End Sub
  574.  
  575.  
  576. Private Sub mnuFileLoad_Click()
  577. Dim fname As String
  578. Dim filenum As Integer
  579. Dim txt As String
  580. Dim Xmin As Single
  581. Dim ymin As Single
  582. Dim xmax As Single
  583. Dim ymax As Single
  584.  
  585.     ' Allow the user to pick a file.
  586.     On Error Resume Next
  587.     LoadDialog.filename = "*.APF"
  588.     LoadDialog.ShowOpen
  589.     If Err.Number = cdlCancel Then
  590.         Unload LoadDialog
  591.         Exit Sub
  592.     ElseIf Err.Number <> 0 Then
  593.         Unload LoadDialog
  594.         Beep
  595.         MsgBox "Error selecting file.", , vbExclamation
  596.         Exit Sub
  597.     End If
  598.     On Error GoTo 0
  599.     
  600.     fname = LoadDialog.filename
  601.     LoadDialog.InitDir = Left$(fname, Len(fname) _
  602.         - Len(LoadDialog.FileTitle) - 1)
  603.  
  604.     ' Clear the picture.
  605.     Set ThePicture = Nothing
  606.     
  607.     ' Open the file.
  608.     filenum = FreeFile
  609.     Open fname For Input As #filenum
  610.     
  611.     ' Make sure it's an Object Picture File.
  612.     Input #filenum, txt
  613.     If txt <> "3D APF PICTURE" Then
  614.         Close filenum
  615.         Beep
  616.         MsgBox "Error reading file """ & fname & """.", , vbExclamation
  617.         Exit Sub
  618.     End If
  619.  
  620.     ' Read the picture.
  621.     MousePointer = vbHourglass
  622.     DoEvents
  623.     Set ThePicture = New ObjPicture
  624.     ThePicture.FileInput filenum
  625.     
  626.     ' Close the file.
  627.     Close filenum
  628.  
  629.     ' Refresh the display.
  630.     DrawData Pict
  631.     
  632.     ' Deselect all the option buttons.
  633.     For CurveNum = 0 To 5
  634.         If CurveChoice(CurveNum).value Then _
  635.             CurveChoice(CurveNum).value = False
  636.     Next CurveNum
  637.     For PathNum = 0 To 5
  638.         If PathChoice(PathNum).value Then _
  639.             PathChoice(PathNum).value = False
  640.     Next PathNum
  641.  
  642.     MousePointer = vbDefault
  643. End Sub
  644.  
  645. Private Sub mnuFileSaveAs_Click()
  646. Dim fname As String
  647. Dim filenum As Integer
  648.  
  649.     ' Allow the user to pick a file.
  650.     On Error Resume Next
  651.     LoadDialog.filename = "*.APF"
  652.     LoadDialog.Flags = cdlOFNOverwritePrompt + cdlOFNHideReadOnly
  653.     LoadDialog.ShowSave
  654.     If Err.Number = cdlCancel Then
  655.         Unload LoadDialog
  656.         Exit Sub
  657.     ElseIf Err.Number <> 0 Then
  658.         Unload LoadDialog
  659.         Beep
  660.         MsgBox "Error selecting file.", , vbExclamation
  661.         Exit Sub
  662.     End If
  663.     On Error GoTo 0
  664.     
  665.     fname = LoadDialog.filename
  666.     LoadDialog.InitDir = Left$(fname, Len(fname) _
  667.         - Len(LoadDialog.FileTitle) - 1)
  668.     
  669.     ' Open the file.
  670.     filenum = FreeFile
  671.     Open fname For Output As #filenum
  672.     
  673.     ' Write the picture.
  674.     ThePicture.FileWrite filenum
  675.     
  676.     ' Close the file.
  677.     Close filenum
  678. End Sub
  679.  
  680.  
  681.  
  682.  
  683.  
  684. Private Sub PathChoice_Click(Index As Integer)
  685.     PathNum = Index
  686.     Pict.SetFocus
  687. End Sub
  688.  
  689. Private Sub PhiText_Change()
  690.     If ShowingParameters Then Exit Sub
  691.     EyePhi = CSng(PhiText.Text)
  692.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  693.     DrawData Pict
  694. End Sub
  695.  
  696. Private Sub RText_Change()
  697.     If ShowingParameters Then Exit Sub
  698.     EyeR = CSng(RText.Text)
  699.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  700.     DrawData Pict
  701. End Sub
  702.  
  703.  
  704. Private Sub ShowAxesCheck_Click()
  705.     CmdExtrude_Click
  706.     Pict.SetFocus
  707. End Sub
  708.  
  709. Private Sub ThetaText_Change()
  710.     If ShowingParameters Then Exit Sub
  711.     EyeTheta = CSng(ThetaText.Text)
  712.     m3PProject Projector, m3Perspective, EyeR, EyePhi, EyeTheta, FocusX, FocusY, FocusZ, 0, 1, 0
  713.     DrawData Pict
  714. End Sub
  715.  
  716.